/*
 * @file ths_log.h  - 日志处理头文件
 */

#ifndef INCLUDE_THS_LOG_H_
#define INCLUDE_THS_LOG_H_

#include "ths_cdefs.h"
#include <stdarg.h> /* for va_list */
#include <stdio.h>
#include <stdlib.h>
#include <time.h>   /* time_t, struct tm, time, localtime */

MXS_BEGIN_DECLS

#if !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L
# if defined __GNUC__ && __GNUC__ >= 2
#  define __func__ __FUNCTION__
# else
#  define __func__ "<unknown>"
# endif
#endif

#if defined __GNUC__
#	define THS_CHECK_PRINTF(m,n) __attribute__((format(printf,m,n)))
#else
#	define THS_CHECK_PRINTF(m,n)
#endif

/**
 * 日志级别
 */
typedef enum {
	THS_LOG_LEVEL_TRACE = 20, 	// 跟踪
	THS_LOG_LEVEL_DEBUG = 40, 	// 调试
	THS_LOG_LEVEL_INFO = 60, 	// 信息
	THS_LOG_LEVEL_WARN = 80, 	// 警告
	THS_LOG_LEVEL_ERROR = 100, 	// 错误
	THS_LOG_LEVEL_OFF = 999 	// 关闭输出
} ths_log_level_t;

/**
 * 初始化日志
 *
 * @param level 日志级别
 */
void ths_log_init(ths_log_level_t level);

/**
 * 日志输出
 *
 * @param file 调用文件名称 eg. src/test.c
 * @param func 调用函数名称
 * @param line 调用行
 * @param level 日志输出级别
 * @param msg 日志内容
 * @param ... 可变参数(printf)，日志内容变量
 */
void ths_log_msg(const char *file, const char *func, long line, ths_log_level_t level,
				const char *msg, ...) THS_CHECK_PRINTF(5,6);

byte_t ths_log_is_trace_enabled();
byte_t ths_log_is_debug_enabled();
byte_t ths_log_is_info_enabled();
byte_t ths_log_is_warn_enabled();
byte_t ths_log_is_error_enabled();

#if defined __STDC_VERSION__ && __STDC_VERSION__ >= 199901L

// 标准C C99 宏定义
#define ths_log_trace(...) \
		if (ths_log_is_trace_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_TRACE, __VA_ARGS__)

#define ths_log_debug(...) \
		if (ths_log_is_debug_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_DEBUG, __VA_ARGS__)

#define ths_log_info(...) \
		if (ths_log_is_info_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_INFO, __VA_ARGS__)

#define ths_log_warn(...) \
		if (ths_log_is_warn_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_WARN, __VA_ARGS__)

#define ths_log_error(...) \
		if (ths_log_is_error_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_ERROR, __VA_ARGS__)

#elif defined __GNUC__

// GNUC 宏定义
#define ths_log_trace(msg, args...) \
		if (ths_log_is_trace_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_TRACE, msg, ##args)

#define ths_log_debug(msg, args...) \
		if (ths_log_is_debug_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_DEBUG, msg, ##args)

#define ths_log_info(msg, args...) \
		if (ths_log_is_info_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_INFO, msg, ##args)

#define ths_log_warn(msg, args...) \
		if (ths_log_is_warn_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_WARN, msg, ##args)

#define ths_log_error(msg, args...) \
		if (ths_log_is_error_enabled()) ths_log_msg(__FILE__, __func__, __LINE__, THS_LOG_LEVEL_ERROR, msg, ##args)

#endif


MXS_END_DECLS

#endif /* INCLUDE_THS_LOG_H_ */
